from django.db.models import Count
from django.shortcuts import render
from post.models import *
from django.core.paginator import *
# 全局上下文
def getrightinfo(request):
    # 分类信息
    from django.db.models import Count
    cate_posts = Post.objects.values('category__cname','category').annotate(count=Count('*')).order_by('-count')

    # 归档信息
    from django.db import connection
    cursor=connection.cursor()
    arc_posts = cursor.execute("select created,count('*') as count from t_post group by strftime('%Y-%m',created) order by count desc")

    # 近期文章
    recent_posts = Post.objects.order_by('-id')[:10]

    return {'cate_posts':cate_posts,'recent_posts':recent_posts,'arc_posts':arc_posts}

# 首页
def index(request):
    # 从URL中获取文章创建时间
    index_created = request.GET.get('created')
    # 从URL中获取分类
    index_category = request.GET.get('category')

    # 判断如果获取到了分类则将分类加入到session中
    if index_category != None:
        request.session['index_category'] = index_category
    elif index_created != None:
        request.session['index_created'] = index_created

    # 根据文章信息查询所有类别,并且分组以及查询每组包含数据条数
    category = Post.objects.values('category__cname','category').annotate(count = Count('*'))

    # 判断如果没有从URL中获取到创建时间则判断是否获取到别的东西
    if index_created == None:
        # 判断是否获取到了分类,如果没有获取到类别则展示全部内容
        if index_category == None:
            post = Post.objects.all().order_by('-id')
            # 如果获取到了类别按照类别去一对多查询所有文章信息
        else:
            post = Post.objects.filter(category__cname=index_category)
    # 如果获取到了创建时间就按照创建时间去查询所有符合的信息,并且按照ID倒序显示
    else:
        post = Post.objects.filter(created=index_created).order_by('-id')

    # 获取数据库中文章的创建时间,并且分组查询每组数据条数,最后按照时间排序
    created = Post.objects.values('created').annotate(count=Count('*')).order_by('-created')

    # 每页显示数据
    paginator = Paginator(post,2)

    # 获取下一页值
    page = request.GET.get('page')

    # 因第一次访问页面时候,没有page值,所以需要捕获page值的异常
    try:
        contacts = paginator.page(page)
    except:
        # 如果传回的页数不是数字,则传递第一个页面
        contacts = paginator.page(1)

    # 查询右边栏所需要的文章信息,主要用于展示标题,并且按照ID倒序显示
    post_r = Post.objects.all().order_by('-id')[:10]

    # 提取session中的类别,用于传到前台使用
    index_category = request.session.get('index_category')
    index_created = request.session.get('index_created')
    # 提取完成后将session清空,(前提先判断session中是否有类别内容)
    if request.session.get('index_category') or request.session.get('index_created'):
        request.session.flush()

    # 将查到所有内容打包成一个字典:所有类别/所有文章/创建时间/某个类别/用于所有文章标题
    sel = {'cate_posts': category, 'arc_posts': contacts, 'created': created,'index_category':index_category,'post_r':post_r,'index_created':index_created}

    # 判断是否获取到头部的"关于"功能,如果不是关于,则传回首页
    if request.GET.get('blog') != 'guanyu':
        return render(request,'index.html',sel)
    # 否则传回关于页面
    else:
        return render(request, 'guanyu.html',sel)

# 文章内容
def post(request):
    # 获取要查询文章的ID信息
    id = request.GET.get('id')
    # 根据ID去查询文章
    content = Post.objects.filter(id=id)
    # 根据文章信息查询所有类别,并且分组以及查询每组包含数据条数
    category = Post.objects.values('category__cname','category').annotate(count=Count('*'))
    # 查询右边栏所需要的文章信息,主要用于展示标题,并且按照ID倒序显示
    post_r = Post.objects.all().order_by('-id')[:10]
    # 获取数据库中文章的创建时间,并且分组查询每组数据条数,最后按照时间排序
    created = Post.objects.values('created').annotate(count=Count('*')).order_by('-created')

    # 将获取到的所有内容打包成一个字典:文章内容/类别/文章信息/创建时间
    sel = {'content': content,'cate_posts':category,'post_r':post_r,'created':created}
    # 将sel字典传到前台
    return render(request, 'content.html', sel)
